﻿using System;
using System.Collections.Generic;
using System.Xml;
using System.Xml.Schema;
using System.Xml.Serialization;
using JQuery.WebKit.Common.Serialization;
using JQuery.WebKit.Common.Utilities;

namespace JQuery.WebKit.Common.Xml
{
    [Serializable,
    XmlRoot(ElementName = "XmlDictionary")]
    public class XmlDictionary<TKey, TValue> : Dictionary<TKey, TValue>, IXmlSerializable
        where TKey : class
        where TValue : class
    {
        #region Constructors
        public XmlDictionary()
        {

        }
        #endregion

        #region IXmlSerializable Members
        XmlSchema IXmlSerializable.GetSchema()
        {
            return null;
        }

        void IXmlSerializable.ReadXml(XmlReader reader)
        {
            while (reader.MoveToNextAttribute())
            {
                TKey key = GenericConverter.Parse<TKey>(reader.Name);
                TValue value = null;
                if (reader.Value != "null")
                {
                    value = GenericConverter.Parse<TValue>(reader.Value);
                }

                this.Add(key, value);
            }
            reader.Read();
        }

        void IXmlSerializable.WriteXml(XmlWriter writer)
        {
            foreach (TKey key in this.Keys)
            {
                writer.WriteStartElement("item");
                string value = this[key] != null ? this[key].ToString() : "null";
                writer.WriteAttributeString("key", key.ToString());
                writer.WriteAttributeString("value", value);
                writer.WriteEndElement();
            }
        }
        #endregion

        public override string ToString()
        {
            return XmlSerialization.ToXML(this);
        }

        public void Sort()
        { 
            //this.Sort(
        }
    }
    //[Serializable]
    //public class XmlDictionary<TKey, TValue> : IDictionary<TKey, TValue>
    //    where TKey : class
    //    where TValue : class
    //{
    //    private List<XmlDictionaryItem<TKey, TValue>> _internalDictionary;

    //    public XmlDictionary()
    //    {
    //        _internalDictionary = new List<XmlDictionaryItem<TKey, TValue>>();
    //    }

    //    #region IDictionary<TKey,TValue> Members

    //    public void Add(TKey key, TValue value)
    //    {
    //        _internalDictionary.Add(new XmlDictionaryItem<TKey, TValue>(key, value));
    //    }

    //    public bool ContainsKey(TKey key)
    //    {
    //        return Keys.Contains(key);
    //    }

    //    public ICollection<TKey> Keys
    //    {
    //        get
    //        {
    //            ICollection<TKey> items = new List<TKey>();
    //            foreach (XmlDictionaryItem<TKey, TValue> de in _internalDictionary)
    //            {
    //                items.Add(de.Key);
    //            }
    //            return items;
    //        }
    //    }

    //    public bool Remove(TKey key)
    //    {
    //        if (key == null)
    //        {
    //            return false;
    //        }
    //        for (int i = 0; i < _internalDictionary.Count; i++)
    //        {
    //            if (_internalDictionary[i].Key.Equals(key))
    //            {
    //                _internalDictionary.RemoveAt(i);
    //                return true;
    //            }
    //        }
    //        return false;
    //    }

    //    public bool TryGetValue(TKey key, out TValue value)
    //    {
    //        value = null;
    //        if (key == null)
    //        {
    //            return false;
    //        }
    //        for (int i = 0; i < _internalDictionary.Count; i++)
    //        {
    //            if (_internalDictionary[i].Key.Equals(key))
    //            {
    //                value = _internalDictionary[i].Value;
    //                return true;
    //            }
    //        }
    //        return false;
    //    }

    //    public ICollection<TValue> Values
    //    {
    //        get 
    //        {
    //            ICollection<TValue> items = new List<TValue>();
    //            foreach (XmlDictionaryItem<TKey, TValue> de in _internalDictionary)
    //            {
    //                items.Add(de.Value);
    //            }
    //            return items;
    //        }
    //    }

    //    public TValue this[TKey key]
    //    {
    //        get
    //        {
    //            if (key == null)
    //            {
    //                return null;
    //            }
    //            TValue val = null;
    //            TryGetValue(key, out val);
    //            return val;
    //        }
    //        set
    //        {
    //            for (int i = 0; i < _internalDictionary.Count; i++)
    //            {
    //                if (_internalDictionary[i].Key.Equals(key))
    //                {
    //                    _internalDictionary[i].Value = value;
    //                    break;
    //                }
    //            }
    //        }
    //    }

    //    #endregion

    //    #region ICollection<KeyValuePair<TKey,TValue>> Members

    //    public void Add(KeyValuePair<TKey, TValue> item)
    //    {
    //        Add(item.Key, item.Value);
    //    }

    //    public void Clear()
    //    {
    //        _internalDictionary.Clear();
    //    }

    //    public bool Contains(KeyValuePair<TKey, TValue> item)
    //    {
    //        for (int i = 0; i < _internalDictionary.Count; i++)
    //        {
    //            if (_internalDictionary[i].Key.Equals(item.Key) && 
    //                _internalDictionary[i].Value.Equals(item.Value))
    //            {
    //                return true;
    //            }
    //        }
    //        return false;
    //    }

    //    public void CopyTo(KeyValuePair<TKey, TValue>[] array, int arrayIndex)
    //    {
    //        //_internalDictionary.CopyTo(
    //        throw new NotImplementedException();
    //    }

    //    public int Count
    //    {
    //        get { throw new NotImplementedException(); }
    //    }

    //    public bool IsReadOnly
    //    {
    //        get { throw new NotImplementedException(); }
    //    }

    //    public bool Remove(KeyValuePair<TKey, TValue> item)
    //    {
    //        throw new NotImplementedException();
    //    }

    //    #endregion

    //    #region IEnumerable<KeyValuePair<TKey,TValue>> Members

    //    public IEnumerator<KeyValuePair<TKey, TValue>> GetEnumerator()
    //    {
    //        throw new NotImplementedException();
    //    }

    //    #endregion

    //    #region IEnumerable Members

    //    System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
    //    {
    //        throw new NotImplementedException();
    //    }

    //    #endregion
    //}
}
